﻿using System;
//4.14.3 fixed语句
//fixed语句是用来锁定托管对象的，如前面例子中的位图。在程序的执行过程中，许多对象都是从堆中分配和回收的。为了避免内存浪费或碎片，垃圾回收器会移动这些对象。
//因此，如果一个对象的地址在引用时发生变化，那么指向该对象的指针是无效的，所以fixed语句会告诉垃圾回收器“锁定”这个对象，而且不要移动它。由于这可能对运行时效率产生一定的影响，所以fixed代码块只能短暂使用，而且堆分配应该避免出现在fixed代码中。

//在一个fixed语句中，可以获得一个指向任意数值类型、数值类型数组或字符串的指针。对于数组和字符串，这个指针实际上是指向第一个元素，它是一种数值类型。
namespace _143_不安全代码和指针_fixed语句
{
    //在引用类型中以内联方式声明的数值类型是要求锁定该引用类型的，如下所示：
    class Test
    {
        int x;
        static void Main(string[] args)
        {
            Test test = new Test();
            unsafe
            {
                fixed(int* p = &test.x) // 锁定测试
                {
                    *p = 9;
                }
                System.Console.WriteLine(test.x);
            }
            //25章 “将结构体映射到未托管内存”中进一步介绍fixed语句。
            Console.ReadKey();
        }
    }
}
